/* timeserv.c a socket - based time of day server
 */
#include	<stdio.h>
#include	<unistd.h>
#include	<sys/types.h>
#include	<sys/socket.h>
#include	<netinet/in.h>
#include	<netdb.h>
#include	<time.h>
#include	<strings.h>

#define	PORTNUM	13000						/* our time service phone number */
#define	HOSTLEN	256
#define	oops(msg)	{perror(msg); exit(1);}

int main(int ac, char * av[])
{
	struct	sockaddr_in	saddr;				/* build our address here */
	struct	hostent		*hp;				/* this is part of our */
	char	hostname[HOSTLEN];				/* address */
	int	sock_id, sock_fd;				/* line id, file desc */
	FILE	*sock_fp;					/* use socket as stream */
	char	*ctime();					/* convert secs to string */
	time_t	thetime;					/* the time we report */

	/*
	 * Step 1: ask kernel for a socket
	 */
	sock_id = socket(PF_INET, SOCK_STREAM, 0);		/* get a socket */
	if (sock_id == -1)
		oops("socket");

	/*
	 * Step 2: bind address to socket.Address is host, port
	 */
	bzero((void *)&saddr, sizeof(saddr));			/* clear out struct */
	gethostname(hostname, HOSTLEN);				/* where am I? */
	hp = gethostbyname(hostname);				/* get info about host */
								/* fill in host part */
	bcopy((void *)hp -> h_addr, (void *)&saddr.sin_addr,
			hp->h_length);
	saddr.sin_port = htons(PORTNUM);			/* fill in socket port */
	saddr.sin_family = AF_INET;				/* fill in addr family */

	if (bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0)
		oops("bind");

	/*
	 * Step 3: allow incoming calls with Qsize=1 on socket
	 */
	if (listen(sock_id, 1) != 0)
		oops("listen");

	/*
	 * main loop: accept(), write(), close()
	 */
	while (1)
	{
		sock_fd = accept(sock_id, NULL, NULL);		/* wait for call */
		printf("Wow! got a call! \n");
		if (sock_fd == -1)
			oops("accept");				/* error getting calls */

		sock_fp = fdopen(sock_fd, "w");			/* we'll write to the */
		if (sock_fp == NULL)				/* socket as a stream */
			oops("fdopen");				/* unless we can't */

		thetime = time(NULL);				/* get time */
								/* and convert to strng */
		fprintf(sock_fp, "The time here is ..");
		fprintf(sock_fp, "%s", ctime(&thetime));
		fclose(sock_fp);				/* release connection */
	}
}
